package com.itany.corejava.util;

import java.util.Arrays;

/**
 * @author 石小俊
 * @date 2024年01月11日 16:45
 */
public class ArrayUtil {

    public static void main(String[] args) {
        int[] arr = createIntArray(10, 1, 10);
        System.out.println(Arrays.toString(arr));
        int[] dist = new int[arr.length];
        copyArray(arr, dist);
        System.out.println(Arrays.toString(dist));
        show(arr);
        change(arr, 3, 5);
        show(arr);
        reverse(arr);
        show(arr);
    }

    /**
     * 随机生成一个int类型的数组,通过方法的参数控制数组的长度、以及取值范围
     * 其值为指定范围x-y之间的整数,且不能重复。参数有三个:数组长度、最小值、最大值
     * @param length
     * @param x
     * @param y
     * @return
     */
    public static int[] createIntArray(int length, int x, int y) {
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            // 随机生成一个x-y之间的整数
            arr[i] = (int) (Math.random() * (y - x + 1) + x);
            // 此时生成的随机数可能会当前数组中已有的值相同,但是在需求中不允许重复
            // 因此,需要将当前生成的值与数组中的元素的值进行比较,判断是否已经存在
            // 只有不重复了,才能加入到数组中
            for (int j = 0; j < i; j++) {
                if (arr[j] == arr[i]) {
                    // 如果重复了,则放弃本次赋值的操作
                    // 即:下标为i的值重新赋值,将外层循环迭代的数组下标-1即可
                    i--;
                    // 退出内层循环
                    break;
                }
            }
        }
        return arr;
    }

    /**
     * 实现复制数组的方法,将源数组的所有元素复制到目标数组中。两个参数:源数组,目标数组
     * @param src
     * @param dist
     */
    public static void copyArray(int[] src, int[] dist) {
        if (src.length == dist.length) {
            for (int i = 0; i < src.length; i++) {
                dist[i] = src[i];
            }
        } else {
            System.out.println("错误:两个数组长度不一致,无法复制!");
        }
    }

    /**
     * 实现输出数组中元素的功能,要求数组的元素以短横杠-分隔
     * @param arr
     */
    public static void show(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + "-");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println();
    }

    /**
     * 实现交换指定数组中指定位置的两个元素的值,三个参数:数组变量、指定的两个位置
     * @param arr
     * @param i
     * @param j
     */
    public static void change(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 将指定数组的所有元素颠倒过来,倒序
     * @param arr
     */
    public static void reverse(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int j = arr.length - 1 - i;
            change(arr, i, j);
        }
    }
}
